﻿using log4net;
using NpgsqlTypes;
using PcaCore.BOL.Pca;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace PcaCore.DAL.Pca
{
    public class dUsuario
    {
        private static readonly ILog log = LogManager.GetLogger(typeof(dUsuario));

        #region Public

        public static void Insert(oUsuario myClass)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca.fn_add_usuario(varchar,--empresa_id $1
                //          varchar,--oficina_id $2
                //          character --usuario_id $3
                //          )RETURNS void
                Core.ExecuteNonQuery("pca.fn_add_usuario",
                                     new oParametro(NpgsqlDbType.Varchar, myClass.empresa_id), 
                                     new oParametro(NpgsqlDbType.Varchar, myClass.oficina_id),
                                     new oParametro(NpgsqlDbType.Varchar, myClass.usuario_id));
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static void Delete(string empresaId,
                                  string oficinaId,
                                  string usuarioId)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca.fn_del_usuario(varchar,--empresa_id $1
                //          varchar,--oficina_id $2
                //          character --usuario_id $3
                //          )RETURNS void
                Core.ExecuteNonQuery("pca.fn_del_usuario",
                                    new oParametro(NpgsqlDbType.Varchar, empresaId),                 
                                    new oParametro(NpgsqlDbType.Varchar, oficinaId),
                                    new oParametro(NpgsqlDbType.Varchar, usuarioId));
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static oVwUsuario Get(string empresaId,
                                     string oficinaId,
                                     string usuarioId)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca.fn_get_usuario(varchar,--empresa_id $1
                //          varchar,--oficina_id $2
                //          character --usuario_id $3
                //          )RETURNS SETOF pca.vw_usuarios
                return Core.GetObjectDb<oVwUsuario>("pca.fn_get_usuario",
                                                    new oParametro(NpgsqlDbType.Varchar, empresaId),                                 
                                                    new oParametro(NpgsqlDbType.Varchar, oficinaId),
                                                    new oParametro(NpgsqlDbType.Varchar, usuarioId));
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static List<oVwUsuario> GetList(string empresaId,
                                               string oficinaId)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca.fn_get_list_usuarios(varchar,--empresa_id $1
                //            varchar --oficina_id $2
                //            )RETURNS SETOF pca.vw_usuarios
                return Core.GetListObjecstDb<oVwUsuario>("pca.fn_get_list_usuarios",
                                                         new oParametro(NpgsqlDbType.Varchar, empresaId),
                                                         new oParametro(NpgsqlDbType.Varchar, oficinaId));
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static List<oUsuario> GetListLibres(string empresaId,
                                                   string oficinaId)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca.fn_get_list_usuarios_libres(varchar,--empresa_id $1
                //               varchar --oficina_id $2
                //                )RETURNS SETOF pca.usuarios
                return Core.GetListObjecstDb<oUsuario>("pca.fn_get_list_usuarios_libres",
                                                       new oParametro(NpgsqlDbType.Varchar, empresaId),
                                                       new oParametro(NpgsqlDbType.Varchar, oficinaId));
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static List<oVwUsuarioEmpresa> GetListEmpresas(string usuarioId)
        {
            try
            {   
                //CREATE OR REPLACE FUNCTION pca.fn_get_list_usuario_empresas(character --usuario_id $1
                //                )RETURNS SETOF pca.vw_usuarios_empresas
                return Core.GetListObjecstDb<oVwUsuarioEmpresa>("pca.fn_get_list_usuario_empresas",
                                                                new oParametro(NpgsqlDbType.Varchar, usuarioId));
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static List<oVwUsuarioEmpresa> GetListOficinas(string usuarioId,string empresaId)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca.fn_get_list_usuario_oficinas(character, --usuario_id $1
                //                varchar --empresa_id
                //                )RETURNS SETOF pca.vw_usuarios_empresas AS
                return Core.GetListObjecstDb<oVwUsuarioEmpresa>("pca.fn_get_list_usuario_oficinas",
                                                                new oParametro(NpgsqlDbType.Varchar, usuarioId),
                                                                new oParametro(NpgsqlDbType.Varchar, empresaId));
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        #endregion
    }
}
